#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <unordered_map>
//将x减小到0的最小操作数：https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/description/
using namespace std;
//思路：从正面来看，显然是很难求出来的，因为没办法同时兼顾两侧的状态
//      因此，转而从反面来想，如果有这样的选取方式，意味着去除的元素和=x,那么剩余的元素和=sum-x
//      因此，等价于 找到一个区间和为sum-x的子数组
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum1=0,sum2=0,ret=INT_MAX;
        int n=nums.size();
        for(int i=0;i<n;i++)
            sum1+=nums[i];    //获得数组和
        int target=sum1-x;
        if(target>=0)
        {
            for(int l=0,r=0;r<n;r++)
            {
                sum2+=nums[r];          //进入窗口
                while(sum2>target)
                {
                    sum2-=nums[l++];    //滑动窗口
                }
                if(sum2==target)        //更新窗口
                    ret=min(ret,n-(r-l+1));
            }
        }
        return ret==INT_MAX?-1:ret;
    }
};
